package review;

import org.junit.Test;

public class T20_isNumber {
    int index = 0;

    public boolean isNumber(String s) {
        if (s == null) {
            return false;
        }

        s = s.trim(); //

        //判断整数部分
        boolean numeric = scanInteger(s);

        //如果存在小数点 检查小数部分是否合法
        if (index < s.length() && s.charAt(index) == '.') {
            index++;
            numeric = scanUnsignedInteger(s) || numeric;
            //  error: numeric || scanUnsignedInteger(s); 如果numeric在之前为true，那么后面的语句不会执行的
        }

        //如果存在 E|e 检查后面的是否为整数数值
        if (index < s.length() && (s.charAt(index) == 'E' || s.charAt(index) == 'e')) {
            index++;
            numeric = numeric && scanInteger(s);
        }
        return numeric && index == s.length();
    }

    /***
     * 扫描有符号数值，判断是否合法
     * @param s
     * @return
     */
    boolean scanInteger(String s) {
        if (index < s.length() && (s.charAt(index) == '+' || s.charAt(index) == '-')) {
            index++;
        }
        return scanUnsignedInteger(s);
    }

    /***
     * 扫描无符号数值，判断是否合法
     * @param s
     * @return
     */
    boolean scanUnsignedInteger(String s) {
        int flag = index;
        while (index < s.length() && s.charAt(index) >= '0' && s.charAt(index) <= '9') {
            index++;
        }
        return index > flag;
    }

    @Test
    public void test() {
//        System.out.println(isNumber("0"));
//        System.out.println(isNumber("e"));
//        System.out.println(isNumber(".1"));
//        System.out.println(isNumber("e10"));
        System.out.println(isNumber("0.8"));
    }
}
